package br.com.mynage.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.mynage.dao.IProjetoDAO;
import br.com.mynage.dao.IUsuarioDAO;
import br.com.mynage.dao.impl.ProjetoHibernateDAO;
import br.com.mynage.dao.impl.UsuarioDaoImpl;
import br.com.mynage.dominio.Projeto;
import br.com.mynage.dominio.Usuario;
import br.com.mynage.exception.DaoException;
import br.com.mynage.exception.NegocioException;
import br.com.mynage.jsf.LoginMBean;
import br.com.mynage.service.IServiceProjeto;

public class ServiceProjetoImpl implements IServiceProjeto {
	private IProjetoDAO iProjetoDAO;
	private IUsuarioDAO iUsuarioDAO;
	
	public ServiceProjetoImpl(){
		this.iProjetoDAO = new ProjetoHibernateDAO();
		this.iUsuarioDAO = new UsuarioDaoImpl();
	}
	
	private void validarProjeto(Projeto projeto) throws NegocioException{
		if(projeto == null || projeto.getNome() == null || projeto.getNome().equals("")){
			throw new NegocioException(new Exception());
		}
		if(projeto == null || projeto.getDescricao() == null || projeto.getDescricao().equals("")){
			throw new NegocioException(new Exception());
		}
	}

	@Override
	public boolean cadastrarProjeto(Projeto projeto, List<String> listaEmails) throws DaoException, NegocioException {
		boolean resposta = true;
		
		projeto.setData(new Date());
		projeto.setUsuarioAdmin(LoginMBean.getInstance());
		
		this.validarProjeto(projeto);
		
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		for(String email : listaEmails){
			List<Usuario> listaUsuariosAux = this.iUsuarioDAO.getByField("email", email);
			if(listaUsuariosAux != null && listaUsuariosAux.size() != 0){
				Usuario usuario = listaUsuariosAux.get(0);
				listaUsuarios.add(usuario);
			}
		}
		listaUsuarios.add(LoginMBean.usuario);
		for(String email : listaEmails){
			if(email.equals(LoginMBean.usuario.getEmail())){
				listaUsuarios.remove(LoginMBean.usuario.getEmail());
			}
		}
		projeto.setUsuarios(listaUsuarios);
		projeto.setUsuarioAdmin(LoginMBean.usuario);
		
		this.iProjetoDAO.cadastrarProjeto(projeto);
		
		return resposta;
	}

	@Override
	public void editar(Projeto projetoEditar, List<String> listaEmailsEditar) throws DaoException, NegocioException {
		this.validarProjeto(projetoEditar);
		
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		for(String email : listaEmailsEditar){
			List<Usuario> listaUsuariosAux = this.iUsuarioDAO.getByField("email", email);
			if(listaUsuariosAux != null && listaUsuariosAux.size() != 0){
				Usuario usuario = listaUsuariosAux.get(0);
				listaUsuarios.add(usuario);
			}
		}
		
		projetoEditar.setUsuarios(listaUsuarios);
		
		this.iProjetoDAO.update(projetoEditar); 
	}

	@Override
	public List<Projeto> buscarProjetos()  throws DaoException {
		return this.iProjetoDAO.buscarProjetos();
	}

	@Override
	public void remover(Projeto projeto) throws DaoException, NegocioException {
		this.validarProjeto(projeto);
		
		this.iProjetoDAO.remove(projeto);
		
	}

	@Override
	public List<Projeto> buscarProjetosPorUsuario(Usuario usuario)
			throws DaoException {
		List<Integer> listaIdsProjetos = this.iProjetoDAO.buscarIdProjetosPorUsuario(usuario);
		List<Projeto> listaProjetos = new ArrayList<Projeto>();
		
		for(Integer id : listaIdsProjetos){
			listaProjetos.add( this.iProjetoDAO.findByPrimaryKey(id));
		}
		return listaProjetos;
	}

}
